import { MCPTool } from "@aicu/mcp-framework";
import { z } from "zod";

const { sleep, uploadImage, publishNote } = require("../xhs-browser.js");

interface PostNoteInput {
  title: string;
  content: string;
  note_type: "normal" | "video";
  image_paths?: string[];
  video_path?: string;
  topics?: string[];
  location?: string;
}

class PostNoteTool extends MCPTool<PostNoteInput> {
  name = "发布小红书笔记";
  description = "发布一篇新的小红书笔记。支持图文笔记和视频笔记。图文笔记需要提供本地图片路径列表（最多9张），视频笔记需要提供本地视频路径。可选添加话题标签和位置信息。注意：需要先登录小红书账号才能发布。";

  schema = {
    title: {
      type: z.string().min(1).max(100),
      description: "笔记标题，最多100个字符",
    },
    content: {
      type: z.string().min(1).max(1000),
      description: "笔记正文内容，最多1000个字符",
    },
    note_type: {
      type: z.enum(["normal", "video"]),
      default: "normal",
      description: "笔记类型：normal=图文笔记，video=视频笔记",
    },
    image_paths: {
      type: z.array(z.string()).optional(),
      description: "本地图片文件路径列表（图文笔记需要，最多9张），例如：['D:/images/pic1.jpg', 'D:/images/pic2.jpg']",
    },
    video_path: {
      type: z.string().optional(),
      description: "本地视频文件路径（视频笔记需要），例如：'D:/videos/my_video.mp4'",
    },
    topics: {
      type: z.array(z.string()).optional(),
      description: "话题标签列表，例如 ['美食', '旅行']。标签会自动添加#号",
    },
    location: {
      type: z.string().optional(),
      description: "位置信息，例如 '上海·陆家嘴'",
    }
  };

  async execute(input: PostNoteInput) {
    const { title, content, note_type, image_paths, video_path, topics, location } = input;

    try {
      // 验证参数
      if (note_type === "normal" && (!image_paths || image_paths.length === 0)) {
        return "错误：图文笔记必须提供至少一张图片路径";
      }

      if (note_type === "video" && !video_path) {
        return "错误：视频笔记必须提供视频路径";
      }

      if (note_type === "normal" && image_paths && image_paths.length > 9) {
        return "错误：图片最多只能上传9张";
      }

      console.log(`[PostNote] 正在发布${note_type === 'video' ? '视频' : '图文'}笔记: ${title}`);

      // 构建笔记内容
      let noteContent = content;

      // 添加话题标签
      if (topics && topics.length > 0) {
        const topicTags = topics.map(t => `#${t}#`).join(' ');
        noteContent = `${noteContent}\n\n${topicTags}`;
      }

      // 添加位置信息
      if (location) {
        noteContent = `${noteContent}\n📍 ${location}`;
      }

      if (note_type === "normal" && image_paths) {
        // 图文笔记：上传所有图片
        console.log("[PostNote] 开始上传图片...");

        const fileIds: string[] = [];
        for (let i = 0; i < image_paths.length; i++) {
          const imagePath = image_paths[i];
          try {
            console.log(`[PostNote] 上传第 ${i + 1}/${image_paths.length} 张图片: ${imagePath}`);
            const uploadResult = await uploadImage(imagePath);
            fileIds.push(uploadResult.file_id);

            // 延迟避免请求过快
            if (i < image_paths.length - 1) {
              await sleep(1);
            }
          } catch (err: any) {
            return `上传图片失败（第 ${i + 1} 张）：${err.message}\n路径：${imagePath}`;
          }
        }

        console.log(`[PostNote] 图片上传完成，共 ${fileIds.length} 张`);

        // 发布笔记
        const publishResult = await publishNote({
          title,
          desc: noteContent,
          type: "normal",
          file_ids: fileIds,
          topics,
          location
        });

        if (publishResult.success || publishResult.note_id || publishResult.id) {
          const noteId = publishResult.note_id || publishResult.id;
          return `✅ 笔记发布成功！\n` +
                 `📝 标题: ${title}\n` +
                 `🖼️ 图片: ${image_paths.length} 张\n` +
                 `🆔 笔记ID: ${noteId || '未返回'}\n` +
                 `${topics && topics.length > 0 ? `🏷️ 标签: ${topics.join(', ')}\n` : ''}` +
                 `${location ? `📍 位置: ${location}\n` : ''}` +
                 `\n可在小红书App或创作者中心查看。`;
        } else {
          return `❌ 笔记发布失败：${JSON.stringify(publishResult)}\n\n` +
                 `可能原因：\n` +
                 `1. 未登录或登录已过期\n` +
                 `2. 内容包含敏感词被拦截\n` +
                 `3. 图片格式不符合要求\n` +
                 `4. 发布过于频繁\n\n` +
                 `请尝试：\n` +
                 `- 检查登录状态\n` +
                 `- 修改内容后重试\n` +
                 `- 稍后再试`;
        }
      }

      if (note_type === "video" && video_path) {
        // 视频笔记：暂时不支持
        return "⚠️ 视频笔记发布功能开发中\n\n" +
               "原因：视频上传需要分片上传和转码，流程较为复杂。\n\n" +
               "当前已准备的数据：\n" +
               JSON.stringify({
                 title,
                 content: noteContent,
                 video_path,
                 topics,
                 location
               }, null, 2) +
               "\n\n💡 建议：\n" +
               "1. 使用图文笔记功能（已完成）\n" +
               "2. 手动前往小红书创作者平台发布视频\n" +
               "3. 等待后续版本支持视频上传";
      }

    } catch (e: any) {
      return `❌ 发布笔记时出错：${e.message}\n\n` +
             `错误详情：${e.stack || '无详细信息'}\n\n` +
             `请检查：\n` +
             `1. 是否已登录小红书账号\n` +
             `2. 图片路径是否正确\n` +
             `3. 图片格式是否为 JPG/PNG\n` +
             `4. 图片大小是否在 10MB 以内`;
    }
  }
}

module.exports = PostNoteTool;
